#!/bin/bash

# 颜色输出函数
f_echo(){
    echo -e "\033[$1m$2\033[0m"
}

# 参数检查
if [ "$#" -ne 6 ]; then
    f_echo 31 "参数错误，请按照如下输入:"
    f_echo 33 "sh git_upload_to_svn.sh <git_url> <git.user> <git_passwd> <sub_dir> <branch_name> <local_repo>"
    exit 1
fi

# 判断是否是合法的 Git 地址
if ! [[ $1 == *.git ]]; then
    f_echo 31 "无效 Git 地址." && exit 1
fi

# 创建本地仓库目录并进入
LOCAL_REPO="$6"
if [ ! -d "$LOCAL_REPO" ]; then
  mkdir -p "$LOCAL_REPO"
fi

cd "$LOCAL_REPO" || { f_echo 31 "无法进入目录: $LOCAL_REPO"; exit 1; }

# 如果没有.git文件就先创建
if [ ! -d ".git" ]; then
  git init
fi

# 提取项目名
PROJECT_DIR=$(basename "$1" .git)

# 构造带认证的 Git 地址（替换 @ 为 %40）
RAW_USERNAME="$2"
URL_USERNAME="${RAW_USERNAME//@/%40}"
CLONE_URL="http://${URL_USERNAME}:${3}@${1#*//}"

git remote add origin "$CLONE_URL"

# 获取指定分支
git fetch origin "$5" || { f_echo 31 "Git fetch 失败，请检查网络、认证、分支是否存在"; exit 1; }

# 启用稀疏检出
git config core.sparsecheckout true
echo "$4" >> .git/info/sparse-checkout
echo "$4/*" >> .git/info/sparse-checkout

# 检出指定目录
git checkout --force FETCH_HEAD || { f_echo 31 "Git checkout 失败，请检查路径是否正确"; exit 1; }

f_echo 36 "✅ Git 拉取完成，准备上传到 SVN..."

# ================
# 以下为上传到 SVN 的部分
# ================
if [[ "$4" == *"101"* ]]; then
    TARGET_ENV="4"
elif [[ "$4" == *"200f"* || "$4" == *"200F"* ]]; then
    TARGET_ENV="3"
fi

# SVN 配置
SVN_REPO="svn://182.22.120.150/dlmu-merge-publish"
SVN_USER="jenkins"
SVN_PASS="jenkins"

# 设置 SVN 本地工作目录
if [ "$TARGET_ENV" == "3" ]; then
   SVN_WORK_DIR="/data/transfer/local_svn_200F_dir"
   SVN_TARGET_DIR="02-工程/00-出厂/01-设备程序/01-200F"
elif [ "$TARGET_ENV" == "4" ]; then
   SVN_WORK_DIR="/data/transfer/local_svn_101_dir"
   SVN_TARGET_DIR="02-工程/00-出厂/01-设备程序/02-101"
fi

if [ ! -d "$SVN_WORK_DIR" ]; then
  mkdir -p "$SVN_WORK_DIR"
fi
cd "$SVN_WORK_DIR" || { f_echo 31 "无法进入 SVN 本地工作目录"; exit 1; }

# 如果没有.svn文件就checkout
if [ ! -d ".svn" ]; then
  f_echo 33 "检出 SVN 子目录仓库..."
  svn co "$SVN_REPO/$SVN_TARGET_DIR" . \
  --username="$SVN_USER" \
  --password="$SVN_PASS" \
  --non-interactive
fi
CURRENT_DIR=$(pwd)
echo "当前目录是: $CURRENT_DIR"

SVN_FILES=$(svn status | awk '$2 != "." {print $2}')
echo "SVN_FILES1: $SVN_FILES"

# 删除当前目录中所有内容，保留 .svn
shopt -s extglob

rm -rf !(.svn)


CURRENT_DIR=$(pwd)
echo "当前目录是: $CURRENT_DIR"

if [ "$TARGET_ENV" == "3" ]; then
   cp -rf /data/transfer/local_git_dir/02-非信创/01-dlmu-station/01-dlmu200f/* /data/transfer/local_svn_200F_dir/

elif [ "$TARGET_ENV" == "4" ]; then
   cp -rf /data/transfer/local_git_dir/02-非信创/01-dlmu-station/02-dlmu101/* /data/transfer/local_svn_101_dir/
fi

# 删除本地没有的，远端svn有的
echo "SVN_FILES: $SVN_FILES"
LOCAL_FILES=$(ls -1)
echo "LOCAL_FILES: $LOCAL_FILES"
for FILE in $SVN_FILES; do
  svn delete "$FILE"
done

f_echo 36 "✅ Git 文件已复制到 SVN 本地工作目录"

# 进入svn 目录，提交svn
cd "$SVN_WORK_DIR"



svn add . --force
svn commit -m "自动上传 Git 拉取内容" .

f_echo 36 "✅ 已提交SVN"

# ================
# 以下为上传程序ZIP部分
# ================

if [ $? -eq 0 ]; then
    f_echo 36 "SVN提交成功，开始进行下载程序ZIP并上传"
    ZIP_UPLOAD_SCRIPT="/transfer-scripts/zip_upload_to_svn.sh"
    if [ -f "$ZIP_UPLOAD_SCRIPT" ]; then
        f_echo 33 "🚀 正在调用脚本 $ZIP_UPLOAD_SCRIPT，上传 ZIP 文件到环境 $TARGET_ENV..."
        # 调用上传 ZIP 的脚本
        sh "$ZIP_UPLOAD_SCRIPT" "$TARGET_ENV"
        if [ $? -eq 0 ]; then
            f_echo 32 "✅ ZIP 文件上传脚本执行成功"
        else
            f_echo 31 "⚠ ZIP 文件上传脚本执行失败，请检查"
        fi
    else
        f_echo 33 "⚠ 未找到 ZIP 上传脚本 $ZIP_UPLOAD_SCRIPT，请检查"
    fi
	
else
    f_echo 31 "❌ SVN 提交失败，请手动检查冲突或错误。"
    exit 1
fi
